#!/usr/bin/python2.7
# -*- coding: utf-8 -*-

#$ -l h_rt=12:00:00
#$ -l virtual_free=500M
#$ -l arch=sol
#$ -o $HOME/popnews.out
#$ -e $HOME/popnews.err
#$ -N popnews

import sys
sys.path.append('/home/artem/pywikipedia')
#sys.path.append('/home/artem/Dropbox/wiki/bot/pywikipedia')

import gzip
import re
import urllib
import urllib2

import calendar
import time
import datetime

import wikipedia

# returns date of the previous day
def get_date():
	return datetime.date.today() - datetime.timedelta(days=1)

def MonthName0(m):
	if m == 1:
		return 'январь'
	elif m == 2:
		return 'февраль'
	elif m == 3:
		return 'март'
	elif m == 4:
		return 'апрель'
	elif m == 5:
		return 'май'
	elif m == 6:
		return 'июнь'
	elif m == 7:
		return 'июль'
	elif m == 8:
		return 'август'
	elif m == 9:
		return 'сентябрь'
	elif m == 10:
		return 'октябрь'
	elif m == 11:
		return 'ноябрь'
	elif m == 12:
		return 'декабрь'

def MonthName(m):
	if m == 1:
		return 'января'
	elif m == 2:
		return 'февраля'
	elif m == 3:
		return 'марта'
	elif m == 4:
		return 'апреля'
	elif m == 5:
		return 'мая'
	elif m == 6:
		return 'июня'
	elif m == 7:
		return 'июля'
	elif m == 8:
		return 'августа'
	elif m == 9:
		return 'сентября'
	elif m == 10:
		return 'октября'
	elif m == 11:
		return 'ноября'
	elif m == 12:
		return 'декабря'

# Загрузка файла по заданному url. Автор: PabloG. Код взят со страницы http://stackoverflow.com/questions/22676/how-do-i-download-a-file-over-http-using-python
def download_url(url):
	print 'Downloading ' + url
	
	file_name = 'pagecounts.gz'
	u = urllib2.urlopen(url)
	meta = u.info()
	file_size = int(meta.getheaders("Content-Length")[0])

	f = open('/home/artem/tmp/' + file_name, 'wb')
	
	file_size_dl = 0
	block_sz = 8192
	while True:
		buffer = u.read(block_sz)
		if not buffer:
			break

		file_size_dl += len(buffer)
		f.write(buffer)

	f.close()

def get_content(date, hour):
	for i in range(60):
		ymdh = date.strftime('%Y%m%d') + '-' + hour + '{:04d}'.format(i)
		try:
			download_url('http://dumps.wikimedia.org/other/pagecounts-raw/' + date.strftime('%Y/%Y-%m') + '/pagecounts-' + ymdh + '.gz')
			return read_gzip('/home/artem/tmp/pagecounts.gz')
		except:
			continue
	return ""

def read_gzip(file_name):
	content = ""
	f = gzip.open(file_name)
	for line in f:
		if line[0:4] == "ru.n":
			content += line
	f.close()
	return content

def get_dict_of_titles():
	import catlib
	
	titles_dict = {}
	site = wikipedia.getSite()
	for page in catlib.Category(site, u'Категория:Опубликовано').articles():
		title = page.title().encode('utf8')
		titles_dict[title] = 0
	wikipedia.stopme()
	return titles_dict

def sum_views(date):
	titles_dict = get_dict_of_titles()
	
	for h in range(0,24):
		content = urllib.unquote(get_content(date, str(h).zfill(2)))
		for line in re.findall('.+', content):
			try:
				title = re.sub('[ ][0-9]+[ ][0-9]+$', '', line).replace('ru.n ', '').replace('_', ' ')
				if title in titles_dict:
					titles_dict[title] += int(re.findall('(?<=[ ])[0-9]+(?=[ ][0-9])', line).pop())
			except:
				print line
				continue
	
	return titles_dict

def make_content(titles_dict, date):
	content = '{{Самые популярные новости/Заголовок|' + str(date.day) + ' ' + MonthName(date.month) + '|' + str(date.year) + '}}\n'
	titles = sorted(titles_dict, key=titles_dict.get, reverse=True)
	for title in titles[0:10]:
		content += '{{Популярная новость|' + str(titles_dict[title]).zfill(4) + '|' + title + '}}\n'
	content += '{{Самые популярные новости/Низ}}<noinclude>\n<div style="font-size:80%; color:grey;">Данный список формируется на основе данных, полученных из [http://dumps.wikimedia.org/other/pagecounts-raw/ дампов] проектов Викимедиа. В количестве просмотров учитываются посещения страниц как людьми, так и автоматизированными программами, поэтому следует иметь ввиду, что данные могут быть подвержены искажениям, хотя в целом отражают реальный интерес к той или иной новости. В статистике учитываются просмотры за период с 00:00:00 до 23:59:59 по [[w:Всемирное координированное время|Всемирному координированному времени]] (UTC). Статистика обновляется автоматически по окончанию дня.</div>\n[[Категория:Викиновости:Шаблоны|Самые популярные новости]][[Категория:Викиновости:Статистика и прогнозы|Самые популярные новости]][[en:Template:Popular articles]]</noinclude>'
	
	return content

def write_to_wp(content, date):
	site = wikipedia.getSite()
	
	page = wikipedia.Page(site, u'Шаблон:Самые популярные новости')
	page_archive = wikipedia.Page(site, u'Викиновости:Архив:Самые популярные новости/' + str(date.year).decode('utf8') + '/' + MonthName0(date.month).decode('utf8'))

	page_text = page.get()
	if page_archive.exists():
		archive_text = page_archive.get()
	else:
		archive_text = u"\n[[Категория:Архивы:Самые популярные новости|*" + str(date.strftime('%Y-%m')).decode('utf8') + u"]]"

	archived_page_text = ''
	for line in re.findall('\{\{.+\}\}', page_text):
		archived_page_text += line + u'\n'

	page_archive.put(archived_page_text + archive_text, comment=u'Архивирование списка самых популярных новостей за прошлый день')
	page.put(content.decode('utf8'), comment=u'Обновление списка самых популярных новостей')

	wikipedia.stopme()

date = get_date()

titles_and_views = sum_views(date)

content = make_content(titles_and_views, date)

f = open('/home/artem/public_html/popnews.html', 'w')
f.write(content)
f.close()
write_to_wp(content, date - datetime.timedelta(days=1))
